Add support for ostree static-delta delete
authorAlexander Larsson <alexl@redhat.com>
Fri, 8 Apr 2016 08:44:24 +0000 (10:44 +0200)
committerColin Walters (automation) <walters+githubbot@verbum.org>
Fri, 8 Apr 2016 13:42:43 +0000 (13:42 +0000)
Closes: #245
Approved by: giuseppe

man/ostree-static-delta.xml
src/libostree/ostree-cmdprivate.c
src/libostree/ostree-cmdprivate.h
src/libostree/ostree-repo-static-delta-core.c
src/libostree/ostree-repo-static-delta-private.h
src/ostree/ot-builtin-static-delta.c
tests/test-delta.sh

index d410a2d6a75b767d7abb9a1a6c72fd8005bdf468..ed2e1f483c1d7a206df76364019c05a43a1c70ed 100644 (file)
@@ -51,6 +51,12 @@ Boston, MA 02111-1307, USA.
             <cmdsynopsis>
                 <command>ostree static-delta list</command>
             </cmdsynopsis>
+            <cmdsynopsis>
+                <command>ostree static-delta show</command>
+            </cmdsynopsis>
+            <cmdsynopsis>
+                <command>ostree static-delta delete</command>
+            </cmdsynopsis>
             <cmdsynopsis>
                 <command>ostree static-delta generate</command> <arg choice="req">--to=REV</arg> <arg choice="opt" rep="repeat">OPTIONS</arg>
             </cmdsynopsis>
index 74c32a3c32bed0ac9c6678c6bf105e42eb0321fa..2c85bb4a09d63670083fd73301472399f518b8c9 100644 (file)
@@ -46,7 +46,8 @@ ostree_cmd__private__ (void)
 {
   static OstreeCmdPrivateVTable table = {
     impl_ostree_generate_grub2_config,
-    _ostree_repo_static_delta_dump
+    _ostree_repo_static_delta_dump,
+    _ostree_repo_static_delta_delete
   };
 
   return &table;
index 810615689d3fdafdba48a6302c283584a4f9cdcc..9a74ead19812c012844c8d38e0e6863eb5f9d01d 100644 (file)
@@ -27,6 +27,7 @@ G_BEGIN_DECLS
 typedef struct {
   gboolean (* ostree_generate_grub2_config) (OstreeSysroot *sysroot, int bootversion, int target_fd, GCancellable *cancellable, GError **error);
   gboolean (* ostree_static_delta_dump) (OstreeRepo *repo, const char *delta_id, GCancellable *cancellable, GError **error);
+  gboolean (* ostree_static_delta_delete) (OstreeRepo *repo, const char *delta_id, GCancellable *cancellable, GError **error);
 } OstreeCmdPrivateVTable;
 
 /* Note this not really "public", we just export the symbol, but not the header */
index d84f00193ab0a13d93a9c4dba555d12b7e3621ee..9e3ed09f65e79934751bd879ed543209b2c68137 100644 (file)
@@ -782,6 +782,41 @@ _ostree_delta_needs_byteswap (GVariant *superblock)
     }
 }
 
+gboolean
+_ostree_repo_static_delta_delete (OstreeRepo                    *self,
+                                  const char                    *delta_id,
+                                  GCancellable                  *cancellable,
+                                  GError                      **error)
+{
+  gboolean ret = FALSE;
+  g_autofree char *from = NULL;
+  g_autofree char *to = NULL;
+  g_autofree char *deltadir = NULL;
+  struct stat buf;
+
+  _ostree_parse_delta_name (delta_id, &from, &to);
+  deltadir = _ostree_get_relative_static_delta_path (from, to, NULL);
+
+  if (fstatat (self->repo_dir_fd, deltadir, &buf, 0) != 0)
+    {
+      if (errno == ENOENT)
+        g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
+                     "Can't find delta %s", delta_id);
+      else
+        glnx_set_error_from_errno (error);
+
+      goto out;
+    }
+
+  if (!glnx_shutil_rm_rf_at (self->repo_dir_fd, deltadir,
+                             cancellable, error))
+    goto out;
+
+  ret = TRUE;
+ out:
+  return ret;
+}
+
 gboolean
 _ostree_repo_static_delta_dump (OstreeRepo                    *self,
                                 const char                    *delta_id,
index 41ddad48fda0578fd59e5d1834e7b731570dc7e7..eeb99c3f79de53222d8a4f8cb7d98dbcb4a597a2 100644 (file)
@@ -196,6 +196,12 @@ _ostree_repo_static_delta_dump (OstreeRepo                 *repo,
                                 GCancellable               *cancellable,
                                 GError                    **error);
 
+gboolean
+_ostree_repo_static_delta_delete (OstreeRepo                 *repo,
+                                  const char                 *delta_id,
+                                  GCancellable               *cancellable,
+                                  GError                    **error);
+
 /* Used for static deltas which due to a historical mistake are
  * inconsistent endian.
  *
index 36fb63faa1e5980e0118b4f8fd7a4f43ae9928f5..09eb90ab55471c731f1e8493047a9bdcd254c6cd 100644 (file)
@@ -42,6 +42,7 @@ static gboolean opt_disable_bsdiff;
 
 BUILTINPROTO(list);
 BUILTINPROTO(show);
+BUILTINPROTO(delete);
 BUILTINPROTO(generate);
 BUILTINPROTO(apply_offline);
 
@@ -50,6 +51,7 @@ BUILTINPROTO(apply_offline);
 static OstreeCommand static_delta_subcommands[] = {
   { "list", ot_static_delta_builtin_list },
   { "show", ot_static_delta_builtin_show },
+  { "delete", ot_static_delta_builtin_delete },
   { "generate", ot_static_delta_builtin_generate },
   { "apply-offline", ot_static_delta_builtin_apply_offline },
   { NULL, NULL }
@@ -168,6 +170,39 @@ ot_static_delta_builtin_show (int argc, char **argv, GCancellable *cancellable,
   return ret;
 }
 
+static gboolean
+ot_static_delta_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error)
+{
+  gboolean ret = FALSE;
+  GOptionContext *context;
+  glnx_unref_object OstreeRepo *repo = NULL;
+  const char *delta_id = NULL;
+
+  context = g_option_context_new ("DELETE - Remove a delta");
+
+  if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
+    goto out;
+
+  if (argc < 3)
+    {
+      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                           "DELTA must be specified");
+      goto out;
+    }
+
+  delta_id = argv[2];
+
+  if (!ostree_cmd__private__ ()->ostree_static_delta_delete (repo, delta_id, cancellable, error))
+    goto out;
+
+  ret = TRUE;
+ out:
+  if (context)
+    g_option_context_free (context);
+  return ret;
+}
+
+
 static gboolean
 ot_static_delta_builtin_generate (int argc, char **argv, GCancellable *cancellable, GError **error)
 {
index 411e9b042bead4a2bd9899085bf982c5ef6a1fd3..4b2b879ab6ab929adbcbae32522f7ac0a26bfb33 100755 (executable)
@@ -26,7 +26,7 @@ skip_without_user_xattrs
 bindatafiles="bash true ostree"
 morebindatafiles="false ls"
 
-echo '1..7'
+echo '1..8'
 
 mkdir repo
 ${CMD_PREFIX} ostree --repo=repo init --mode=archive-z2
@@ -186,3 +186,18 @@ ${CMD_PREFIX} ostree --repo=repo2 fsck
 ${CMD_PREFIX} ostree --repo=repo2 ls ${newrev} >/dev/null
 
 echo 'ok apply offline inline'
+
+${CMD_PREFIX} ostree --repo=repo static-delta list | grep ^${origrev}-${newrev}$ || exit 1
+${CMD_PREFIX} ostree --repo=repo static-delta list | grep ^${origrev}$ || exit 1
+
+${CMD_PREFIX} ostree --repo=repo static-delta delete ${origrev} || exit 1
+
+${CMD_PREFIX} ostree --repo=repo static-delta list | grep ^${origrev}-${newrev}$ || exit 1
+${CMD_PREFIX} ostree --repo=repo static-delta list | grep ^${origrev}$ && exit 1
+
+${CMD_PREFIX} ostree --repo=repo static-delta delete ${origrev}-${newrev} || exit 1
+
+${CMD_PREFIX} ostree --repo=repo static-delta list | grep ^${origrev}-${newrev}$ && exit 1
+${CMD_PREFIX} ostree --repo=repo static-delta list | grep ^${origrev}$ && exit 1
+
+echo 'ok delete'